前向神经网络

深度学习应用于自然语言处理-前向神经网络

引言

深度学习的浪潮袭来,现已在各个领域中应用。深度学习的表现令人叹为观止,不得不说我们迎来了依靠深度学习的人工智能学习时代。

 人工智能,让世界更美好。

这一章主要是通过学习 Stanford cs224d 课程已经阅读一些有些的博客所作出的总结。

本章介绍

从数学的角度对前向神经网络数学模型进行介绍、推导和证明。

前提知识

线性代数(Linear Algebra)
概率论(Probability Theory)
凸优化(Convex Optimization)

前向神经网络

所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。以下是一个简单的三层前向全连接神经网络:

neural networks

图中x为输入层,h为隐藏层,$\hat{y}$为输出层。在全连接网络中,上一层和下一层的每个神经元都相连。隐藏层在接收到输入x后会进行一个非线性变化,再将输出信号传递给下一层。非线性变换由激活函数(activation function)实现。在数学上,我们可以用矩阵乘法(Matrix multiplication)来解释:

式中sigmoidsoftmax都是一个激活函数,W是指两层之间的权重,b是偏置量。我们可以看到x进行了线性变换后,再做非线性变换,x输出的信号将作为b的输入。

激活函数(Activation fuction)

激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。激活函数的缺点是如果模型比较复杂,面对样本数不大的情况时容易出现过拟合。常用的激活函数还有tanh函数RelU函数等等。

sigmoid函数的数学形式:

sigmoid函数求导:

sigmoid函数和导数python实现:

1
2
3
4
5
6
7
8
9
import numpy as np
def sigmoid(x):
x = 1./(1+np.exp(-x))
return x
# grad
def sigmoid_grad(f):
f = f*(1-f)
return f

softmax函数的数学形式:

softmax函数求导:

softmax函数的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy
# 输出softmax函数值,输入向量或矩阵x
def softmax(x):
if len(x.shape)>1:
max = np.max(x,axis=1)[:,np.newaxis]
x -= max
x = np.exp(x)
softmax_deno = np.sum(x, axis=1)[:,np.newaxis]
x = x/softmax_deno
else:
max = np.max(x)
x -= max
x = np.exp(x)
softmax_deno = np.sum(x)
x = x/softmax_deno
return x

 目标函数(Objective fuction)

目标函数,有时候又称损失函数(loss function),代价函数(cost function ),是网络中的性能参数,也是编译一个模型必须的两个参数之一。在训练模型时,我们的最终目标就是最大化或者最小化目标函数,用$J$表示目标函数。

交叉熵(Cross entropy)

一种常见的目标函数形式:

其中$i$代表响应的类别,$y_i$是训练样本中的标签,而$\hat{y}_i$模型预测结果。

一般情况下,我们对$y_i$使用one-hot编码,而$\hat{y}$代表了对应类别的概率$p(y_i|w,x)$,因此,$\sum_i\hat{y_i}=1$,在这里我们称$y_i$为预测函数。

*对$\hat{y}$求导:

对向量$\hat{\boldsymbol{y}}=(\hat{y}_1,\ \dots\ ,\hat{y}_c)$求导:

 预测函数(Predict function)

对于预测函数$\hat{y}_i$,我们取$\hat{y}_i$最大的$i$作为模型最终预测的类别。使用softmax函数对输出层的输入进行归一化操作,数学表示为:

其中$c$表示类别个数,在这里即是输出层的神经元个数。$z_i$为输出层的输入。

根据softmax函数的求导可知,预测函数$\hat{y}_i$对$z_i$求导:

根据链式法则,目标函数$J$对$z_i$求导:

目标函数$J$对向量$z$求导:

前向传播(Forward propagation)

前向传播是求目标函数值的过程,从输入层开始,样本的特征向量$x$遍历模型,到达输出层$\hat{y}$,再将$\hat{y}$和 $y$进行比较,得到目标函数值$J$:

训练模型的过程就是优化目标函数的过程,我们需要最小化$J=J(\boldsymbol{W}_1,\boldsymbol{b}_1,\boldsymbol{W}_2,\boldsymbol{b_2})$,这歌优化过程我们可以使用梯度下降法,但是由于$J$是一个非凸函数,因此不能使用梯度下降法求得全局最优,也就是不能获得的$J$最小值。

随机梯度下降(Stochastic gradient descent)

我们可以求目标函数的梯度,它代表目标函数变化增加最快的地方。相反,沿着梯度相反的方向,梯度减少最快,所以我们可以使用迭代的方法更新参数,使得目标函数往着最优的方向进行优化,找到目标函数的最小值:

$t$表示第$t$次进行迭代更新,$\alpha$表示学习率,代表着每一次迭代要走的步长,$W$表示我们需要更新的参数,在本例子中,我们需要对$W_1$,$b_2$,$W_2$,$b_2$进行参数更新,每次迭代都需要进行梯度的计算,每次迭代都要计算目标函数的值。

假设训练样本数量为$N$,如果每次迭代都使用所有的训练样本。这时的目标函数是:

当$N$很大的时候,每次迭代都十分耗时,因此收敛的速度会较慢。我们可以使用一种逼近方法,称为mini-batch

  • mini-batch很简单,就是每次迭代更新只使用$k$个训练样本,$k$可以是100这种相对较小的数。
  • 随机梯度下降(SGD)是每次更新迭代只使用$1$个训练样本,即$k=1$。SGDmini-batch的特殊情况,但是我们一般说SGD就是指mini-batch

后向传播(Backward propagation)

后向传播就是一个求梯度的过程从输出层开始往输入层传入误差。

我们将三层全连接神经网络模型的前向传播表示为:

计算后向传播:

$\boldsymbol{\delta}_1$就是预测误差,得到上面传播的误差,我们对每一层的参数求梯度:

-------------本文结束感谢您的阅读-------------
很有帮助,打赏感谢!
0%